import axios, {AxiosRequestConfig} from 'axios';

declare module 'axios' {
    export interface AxiosRequestConfig {
        retryTimes?: number,
        retryDelay?: number
    }
}

// 设置默认重试次数和重试间隔
axios.defaults.retryTimes = 3;
axios.defaults.retryDelay = 1000;

const request = (config: AxiosRequestConfig) => {
    const instance = axios.create({
        baseURL: '/api',
        timeout: 5000
    })

    instance.interceptors.request.use(config => {
        // 在发送请求之前携带token
        let token = window.localStorage.getItem('token') || window.sessionStorage.getItem('token')
        if (token) {
            config.headers['Authorization'] = 'Bearer ' + token;
        }
        return config;
    }, error => {
        return Promise.reject(error);
    })

    instance.interceptors.response.use(res => {
        // 2xx 范围内的状态码都会触发该函数。
        return res.data;
    }, error => {
        let config = error.config;

        // 如果你不希望所有接口都使用请求重试，请注释掉默认重试次数和重试间隔，并放开下面的注释代码
        // if (!config || !config.retryTimes) return Promise.reject(error);

        const {__retryCount = 0, retryDelay = 300, retryTimes} = config;
        // 在请求对象上设置重试次数
        config.__retryCount = __retryCount;
        // 判断是否超过了重试次数
        if (__retryCount >= retryTimes) {
            return Promise.reject(error);
        }
        // 增加重试次数
        config.__retryCount++;
        // 延时处理
        const delay = new Promise((resolve) => {
            setTimeout(() => {
                resolve('retry');
            }, retryDelay);
        });
        // 重新发起请求
        return delay.then(function () {
            return instance(config);
        });
    })

    return instance(config);
}


export default request;

